//Dart 专有的高级写法
library MyKu5;

abstract class Vehicle {}

abstract class MotorVehicle extends Vehicle {}

abstract class NonMotorVehicle extends Vehicle {}

//将各自的能力抽成独立的Mixin类
mixin PetrolDriven {
  //使用mixin关键字代替class声明一个Mixin类
  void petrolDriven() => print("汽油驱动");
}

mixin PassengerService {
  //使用mixin关键字代替class声明一个Mixin类
  void passengerService() => print("载人");
}

mixin CargoService {
  //使用mixin关键字代替class声明一个Mixin类
  void carryCargo() => print("载货");
}

mixin ElectricalDriven {
  //使用mixin关键字代替class声明一个Mixin类
  void electricalDriven() => print("电能驱动");
}

class Motor extends MotorVehicle with PetrolDriven, PassengerService, CargoService {}

class Bus extends MotorVehicle with PetrolDriven, ElectricalDriven, PassengerService {}

class Truck extends MotorVehicle with PetrolDriven, CargoService {}

class Bicycle extends NonMotorVehicle with ElectricalDriven, PassengerService {}

class Bike extends NonMotorVehicle with PassengerService {}

// 当想要在不同的类层次结构中多个类之间共享相同的行为时或者无法合适抽象出部分子类共同的行为到基类中时.
// 比如说上述例子中在 MotorVehicle (机动车)和 Non-MotorVehicle (非机动车)两个不同类层次结构中，其中 Bus (公交车)
// 和 Bicycle (电动自行车)都有相同行为 ElectricalDriven 和 PassengerService. 但是很明显你无法把这个两个共同的行为
// 抽象到基类 Vehicle 中，因为这样的话 Bike (自行车)继承 Vehicle 会自动带有一个 ElectricalDriven 行为就比较诡异。
// 所以这种场景下mixins就是一个不错的选择，可以跨类层次之间复用相同行为的实现。
